package taliav3;

/**
 *
 *
 * Klasa, w ktorej zdefiniowane zostaly statyczne metody
 * odpowiedzialne za zapis/odczyt danych wysylanych
 * w transmisji sieciowej miedzy 2 aplikacjami (graczami).
 * W celu przyspiesznia transmisji obiekty tworzone sa na
 * komputerze gracza, a przesylane sa tylko pojedyncze
 * skladowe karty/talii/klasy DrawTable wymagane do potrzebnej
 * pracy programu.
 *
 */

import java.io.*;
import java.net.*;

public class NetworkAdapters {

    protected static void Read (DrawTable table, Thread thread)
    {
        Card b = new Card();
        try
        {
            table.talia.ActiveCard=(Card)table.wejscie.readObject();
            if(table.talia.ActiveCard.joker)
                table.talia.ActiveCard.pathAwers=Card.ImagePath(table.talia.ActiveCard.color, 'B', table.taliaI);
            else
                table.talia.ActiveCard.pathAwers=Card.ImagePath(table.talia.ActiveCard.color, table.talia.ActiveCard.rank, table.taliaI);
            table.talia.get=table.wejscie.readInt();
            table.talia.demand=table.wejscie.readChar();
            table.talia.demandQueue=table.wejscie.readInt();
            table.players[0].QueueStop=table.wejscie.readInt();
            table.players[1].QueueStop=table.wejscie.readInt();

            int wielk=0;
            wielk=table.wejscie.readInt();
            table.talia.Decks.removeAll(table.talia.Decks);
            for(int i=0;i<wielk;i++)
            {
                char rank=table.wejscie.readChar();
                char color=table.wejscie.readChar();
                boolean joker=table.wejscie.readBoolean();
                int ind = table.wejscie.readInt();
                b = new Card(rank,color,Card.SetPunish(rank, color),Card.ImagePath(color, rank, table.taliaI),joker);
                b.ind = ind;
                table.talia.Decks.add(b);
            }
            table.talia.Used.removeAll(table.talia.Used);
            wielk=table.wejscie.readInt();
            for(int i=0;i<wielk;i++)
            {
                char rank=table.wejscie.readChar();
                char color=table.wejscie.readChar();
                boolean joker=table.wejscie.readBoolean();
                int ind = table.wejscie.readInt();
                b = new Card(rank,color,Card.SetPunish(rank, color),Card.ImagePath(color, rank, table.taliaI),joker);
                b.ind = ind;
                table.talia.Used.add(b);
            }
            UpdateCardsThread(0,table);
            UpdateCardsThread(1,table);
            table.koniec_gry=table.wejscie.readBoolean();
        }
        catch(SocketException ConnectionReset)
        {
            table.table.dispose();
            MainMenu main = new MainMenu(table.rewersI,table.taliaI,table.joker,table.path,table.Server,table.port,table.serwerpath);
            thread.stop();
        }
        catch(ClassNotFoundException classnot)
        {
            System.err.println("Data received in unknown format");
        }
        catch(IOException ioException)
        {
            ioException.printStackTrace();
        }
    }
    protected static void Write(DrawTable table)
    {
        try
        {
            DrawTable.wyjscie.writeObject(table.talia.ActiveCard);
            DrawTable.wyjscie.writeInt(table.talia.get);
            DrawTable.wyjscie.writeChar(table.talia.demand);
            DrawTable.wyjscie.writeInt(table.talia.demandQueue);
            DrawTable.wyjscie.writeInt(table.players[0].QueueStop);
            DrawTable.wyjscie.writeInt(table.players[1].QueueStop);
            int wielko=table.talia.Decks.size();
            DrawTable.wyjscie.writeInt(wielko);
            for(int i=0;i<table.talia.Decks.size();i++)
            {
		DrawTable.wyjscie.writeChar(table.talia.Decks.get(i).rank);
                DrawTable.wyjscie.writeChar(table.talia.Decks.get(i).color);
                DrawTable.wyjscie.writeBoolean(table.talia.Decks.get(i).joker);
                DrawTable.wyjscie.writeInt(table.talia.Decks.get(i).ind);
            }
            wielko=table.talia.Used.size();
            DrawTable.wyjscie.writeInt(wielko);
            for(int i=0;i<table.talia.Used.size();i++)
            {
                DrawTable.wyjscie.writeChar(table.talia.Used.get(i).rank);
                DrawTable.wyjscie.writeChar(table.talia.Used.get(i).color);
                DrawTable.wyjscie.writeBoolean(table.talia.Used.get(i).joker);
                DrawTable.wyjscie.writeInt(table.talia.Used.get(i).ind);
            }
            wielko=table.players[0].getPlayerCardsAmount();
            DrawTable.wyjscie.writeInt(wielko);
            for(int i=0;i<wielko;i++)
            {
                DrawTable.wyjscie.writeChar(table.players[0].getCard(i).rank);
                DrawTable.wyjscie.writeChar(table.players[0].getCard(i).color);
                DrawTable.wyjscie.writeBoolean(table.players[0].getCard(i).joker);
                DrawTable.wyjscie.writeInt(table.players[0].getCard(i).ind);
            }
            wielko=table.players[1].getPlayerCardsAmount();
            DrawTable.wyjscie.writeInt(wielko);
            for(int i=0;i<wielko;i++)
            {
                DrawTable.wyjscie.writeChar(table.players[1].getCard(i).rank);
                DrawTable.wyjscie.writeChar(table.players[1].getCard(i).color);
                DrawTable.wyjscie.writeBoolean(table.players[1].getCard(i).joker);
                DrawTable.wyjscie.writeInt(table.players[1].getCard(i).ind);
            }
            DrawTable.wyjscie.writeBoolean(table.koniec_gry);
            DrawTable.wyjscie.flush();
        }
        catch(IOException ioException)
        {
                ioException.printStackTrace();
        }
    }
    private static void UpdateCards(int i, DrawTable table)
    {
        try
        {
            int wielko=table.players[i].getPlayerCardsAmount();
            DrawTable.wyjscie.writeInt(wielko);
            for(int j=0;j<wielko;j++)
            {
                DrawTable.wyjscie.writeChar(table.players[i].getCard(j).rank);
                DrawTable.wyjscie.writeChar(table.players[i].getCard(j).color);
                DrawTable.wyjscie.writeBoolean(table.players[i].getCard(j).joker);
                DrawTable.wyjscie.writeInt(table.players[i].getCard(j).ind);
            }
        }
        catch(IOException ioException)
        {
            ioException.printStackTrace();
        }
    }
    private static void UpdateCardsThread(int i, DrawTable table)
    {
        Card b = new Card();
	try
        {
            int wielk=table.wejscie.readInt();
            table.players[i].tPlayer.removeAll(table.players[i].tPlayer);
            for(int j=0;j<wielk;j++)
            {
		char rank=table.wejscie.readChar();
                char color=table.wejscie.readChar();
                boolean joker=table.wejscie.readBoolean();
                int ind = table.wejscie.readInt();
                b = new Card(rank,color,Card.SetPunish(rank, color),Card.ImagePath(color, rank, table.taliaI),joker);
                b.ind = ind;
                table.players[i].add(b);
            }
        }
        catch(IOException ioException)
        {
            ioException.printStackTrace();
	}
    }
    protected static void OdbiorClient(DrawTable table)
    {
        Card b = new Card();
	try
	{
            for(int i=0;i<6;i++)
            {
		try
		{
                    b = (Card)table.wejscie.readObject();
                    table.players[0].setCard(b, i);
                    //table.ReDrawComponents(true,0);
                }
		catch(ClassNotFoundException classnot)
		{
                    System.err.println("Data received in unknown format");
                }
            }
            for(int i=0;i<6;i++)
            {
		try
		{
                    b = (Card)table.wejscie.readObject();
                    table.players[1].setCard(b, i);
                    table.players[1].getCard(i).pathAwers=Card.ImagePath(table.players[1].getCard(i).color, table.players[1].getCard(i).rank, table.taliaI);
                    //table.ReDrawComponents(true,0);
		}
		catch(ClassNotFoundException classnot)
		{
                    System.err.println("Data received in unknown format");
		}
            }
            int wielk=0;
            wielk = table.wejscie.readInt();
            for(int i=0;i<wielk;i++)
            {
                try
		{
                    b = (Card)table.wejscie.readObject();
                    table.talia.Decks.set(i, b);
		}
		catch(ClassNotFoundException classnot)
		{
                    System.err.println("Data received in unknown format");
		}
            }
            //table.ReDrawComponents(true,0);
	}
	catch(IOException ioException)
	{
            ioException.printStackTrace();
	}
    }
    protected static void WyjscieServer(DrawTable table)
    {
        try
        {
            table.wyjscie.writeObject(table.talia.ActiveCard);
            for(int i=0;i<6;i++)
		table.wyjscie.writeObject(table.players[0].getCard(i));
            for(int i=0;i<6;i++)
            	table.wyjscie.writeObject(table.players[1].getCard(i));
            table.wyjscie.flush();
            int wielko=table.talia.Decks.size();
            table.wyjscie.writeInt(wielko);
            table.wyjscie.flush();
            for(int i=0;i<table.talia.Decks.size();i++)
                table.wyjscie.writeObject(table.talia.Decks.get(i));
	}
	catch(IOException ioException)
	{
            ioException.printStackTrace();
	}
    }
}
